Zapsat string do souboru
Otázka od: Pavel Hauptman
17. 9. 2004 8:59
Ahoj,
snazim se zapsat string do souboru, ale jako prvni znak stringu mi to
vzdycky zapise nesmysl. Takto to ukladam:
type TVetaS = record
lngh: word;
cod1: string[32];
end;
var VetaS: TVetaS;
fout: TFileStream;
begin
FillChar(VetaS, SizeOf(VetaS), #0);
VetaS.lngh := 4;
VetaS.cod1 := 'ahoj'
fout := TFileStream.Create(FName, fmOpenReadWrite);
fout.Write(VetaS.lngh, 2);
fout.Write(VetaS.cod1, 32);
fout.Size := fout.Position;
fout.free;
end;
Jak to mam udelat, aby mi to spravne zapisovalo data s retezcem dlouhym 32
bytu?
Diky a s pozdravem
Pavel Hauptman
Odpovedá: Ales Vasicek
17. 9. 2004 8:48
Ahoj
var
FS : TFileStream;
S : string;
begin
S := 'Ahoj';
FS := TFileStream.Create(.., ..);
try
FS.Write(Pointer(S)^, Length(S));
finally
FS.Free;
end;
end;
> -----Original Message-----
> From: Pavel Hauptman [mailto:phauptman@bilbo.cz]
>
> snazim se zapsat string do souboru, ale jako prvni znak stringu mi to
> vzdycky zapise nesmysl. Takto to ukladam:
>
> type TVetaS = record
> lngh: word;
> cod1: string[32];
> end;
> var VetaS: TVetaS;
> fout: TFileStream;
> begin
> FillChar(VetaS, SizeOf(VetaS), #0);
> VetaS.lngh := 4;
> VetaS.cod1 := 'ahoj'
> fout := TFileStream.Create(FName, fmOpenReadWrite);
> fout.Write(VetaS.lngh, 2);
> fout.Write(VetaS.cod1, 32);
> fout.Size := fout.Position;
> fout.free;
> end;
Odpovedá: Pavel Hauptman
17. 9. 2004 9:10
To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
operaci Pointer(S)^.
Pavel Hauptman
> var
> FS : TFileStream;
> S : string;
> begin
> S := 'Ahoj';
> FS := TFileStream.Create(.., ..);
> try
> FS.Write(Pointer(S)^, Length(S));
> finally
> FS.Free;
> end;
> end;
Odpovedá: Ondrej Kelle
17. 9. 2004 9:17
> var
> FS : TFileStream;
> S : string;
> begin
> S := 'Ahoj';
> FS := TFileStream.Create(.., ..);
> try
> FS.Write(Pointer(S)^, Length(S));
> finally
> FS.Free;
> end;
> end;
To ano, ale v jeho pripade sa jedna o shortstring, ktory je staticky
alokovany. Pretypovanie na Pointer je invalid typecast.
>> type TVetaS = record
>> lngh: word;
>> cod1: string[32];
>> end;
>> var VetaS: TVetaS;
[snip]
V pripade shortstringu to ma byt takto:
fout.Write(VetaS.cod1[1], 32);
Prvy byte (.cod1[0]) totiz obsahuje dlzku stringu.
HTH
TOndrej
Odpovedá: Milan Tomes
17. 9. 2004 9:56
A co tohle:
@S[1]
S pozdravem
Milan Tomes
> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Pavel Hauptman
> Sent: Friday, September 17, 2004 10:08 AM
>
> To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
> kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
> operaci Pointer(S)^.
>
> Pavel Hauptman
>
> > var
> > FS : TFileStream;
> > S : string;
> > begin
> > S := 'Ahoj';
> > FS := TFileStream.Create(.., ..);
> > try
> > FS.Write(Pointer(S)^, Length(S));
> > finally
> > FS.Free;
> > end;
> > end;
>
>
>
Odpovedá: Miso
17. 9. 2004 9:52
----- Original Message -----
From: "Pavel Hauptman" <phauptman@bilbo.cz>
> To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
> kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
> operaci Pointer(S)^.
>
..tak skus nieco taketo..je to sice naopak, t.j. obsah suboru natiahnem do
WideString, ale mozes sa inspirovat
----------
function GetData(var Data: WideString): Integer;
var f : TFileStream;
ss : TStringStream;
begin
result := -1;
try
try
if FileExists(FullPath) then
f := TFileStream.Create(FullPath, fmOpenRead);
ss := TStringStream.Create('');
try
ss.CopyFrom(f, f.Size);
Data := ss.DataString;
finally
FreeAndNil(ss);
end;
finally
FreeAndNil(f);
end;
except on e:Exception do
begin
ShowMessage('Error : '+ e.Message);
exit;
end;
end;
result := 0;
end;
---------------------
Miso
Odpovedá: Petr Kuklik
17. 9. 2004 9:56
U TMemoryStream pouzivam prevod na pchar, pak to vypada takto
var Str : string;
pStr : pchar;
MS : TMemoryStream;
begin
.....
Str := 'ahoj';
pStr := pchar(Str);
MS.write(pStr[0], length(pSTr));
.....
end;
Myslim si, ze u TFileStreamu to bude stejne.
Petr
>>> "Pavel Hauptman" <phauptman@bilbo.cz> 17.9.2004 10:08:00 >>>
To jsem zkousel, ale to mi nezapise do souboru string o delce 32 bytu. A
kdys promenou S nadefinuju jako string[32], hlasi to Invalid Typecast pri
operaci Pointer(S)^.
Pavel Hauptman
> var
> FS : TFileStream;
> S : string;
> begin
> S := 'Ahoj';
> FS := TFileStream.Create(.., ..);
> try
> FS.Write(Pointer(S)^, Length(S));
> finally
> FS.Free;
> end;
> end;